package com.sunyifeng.ch03;

import java.io.*;

/**
 * 3.3 环绕执行模式（哪里可以使用lambda）
 * 第一种方案：java7增强的try语句
 * 第二种方案：java8函数式写法
 */
public class ExecuteAround {

	/** 第一种方案：java7增强的try语句，默认close */
    public static String processFileLimited() throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader("./pom.xml"))) { // 只能读一句
            return br.readLine(); // 一次只能读一行
        }
    }

    /** 第二种方案：java8 lambda写法，需要先定义一个函数式的接口 */
	// 1) 定义函数式接口
	@FunctionalInterface //编译器会检查函数式接口，类似@override
	public interface BufferedReaderProcessor{
		String process(BufferedReader b) throws IOException;
	}

	// 2) 函数接口参数
	public static String processFile(BufferedReaderProcessor p) throws IOException {
		try(BufferedReader br = new BufferedReader(new FileReader("./pom.xml"))){
			return p.process(br);
		}

	}

	/** 调用以上两种方案 */
	public static void main(String ...args) throws IOException{
		//当前工作路径（vm调用路径）
		System.out.println("当前工作路径：" + System.getProperty("user.dir"));

		// method we want to refactor to make more flexible
		System.out.println("--java7的写法：输出一行的内容-----------------------------------------");
		String result = processFileLimited();
		System.out.println(result);

		System.out.println("--java8的写法：输出一行的内容-----------------------------------------");
		String oneLine = processFile((BufferedReader b) -> b.readLine());
		System.out.println(oneLine);

		System.out.println("--java8的写法：输出两行的内容(调用了两次readLine())----------------------------------------");
		String twoLines = processFile((BufferedReader b) -> b.readLine() + b.readLine());
		System.out.println(twoLines);

	}
}
